#ifndef __LOG_H_
#define __LOG_H_

#ifdef __cplusplus
extern"C"
{
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>


#define SYSLOG_DEBUG    (2) // 0: all off; 1:only syslog, 2: syslog and terminal, other : terminal
#define LOG_LEVEL LOG_DEBUG


// LOG_EMERG   ： 紧急情况，需要立即通知技术人员。
// LOG_ALERT   ： 应该被立即改正的问题，如系统数据库被破坏，ISP连接丢失。
// LOG_CRIT    ： 重要情况，如硬盘错误，备用连接丢失。
// LOG_ERR     ： 错误，不是非常紧急，在一定时间内修复即可。
// LOG_WARNING ： 警告信息，不是错误，比如系统磁盘使用了85%等。
// LOG_NOTICE  ： 不是错误情况，也不需要立即处理。
// LOG_INFO    ： 情报信息，正常的系统消息，比如骚扰报告，带宽数据等，不需要处理。
// LOG_DEBUG   ： 包含详细的开发情报的信息，通常只在调试一个程序时使用。

#define DEFAULT   "\033[0m"
#define BLACK     "\033[0;30m\033[1m"
#define RED       "\033[0;31m\033[1m"
#define GREEN     "\033[0;32m\033[1m"
#define YELLOW    "\033[0;33m\033[1m"
#define BLUE      "\033[0;34m\033[1m"
#define PURPLE    "\033[0;35m\033[1m"
#define CYAN      "\033[0;36m\033[1m"
#define WHITE     "\033[0;37m\033[1m"

#define TEXT_COLOR(color,s)   color s "\033[0m"

#define TOSTR(R) #R
#define LOCATION_ROW(row) "[ " __FILE__ " @ " TOSTR(row) " ]"
#define LOCATION LOCATION_ROW(__LINE__)

#if SYSLOG_DEBUG == 0
#define outc( logLevel, color, fmt, ... )
#elif SYSLOG_DEBUG == 1
#define outc( logLevel, color, fmt, ... ) \
    syslog( logLevel, fmt, ##__VA_ARGS__ );
#elif SYSLOG_DEBUG == 2
#define outc( logLevel, color, fmt, ... ) \
    syslog( logLevel, fmt, ##__VA_ARGS__ );\
    printf( TEXT_COLOR( color, fmt ), ##__VA_ARGS__ );
#else
#define outc( logLevel, color, fmt, ... ) \
    printf( TEXT_COLOR( color, fmt ), ##__VA_ARGS__ );
#endif

#if LOG_DEBUG > LOG_EMERG

#if LOG_LEVEL < LOG_DEBUG
#define logDebug( fmt, ...  )
#else
#define logDebug( fmt, ...  )\
    outc( LOG_DEBUG, DEFAULT, LOCATION fmt, ##__VA_ARGS__ )
#endif

#if LOG_LEVEL < LOG_INFO
#define logInfo( fmt, ...  )
#else
#define logInfo( fmt, ...  )\
    outc( LOG_INFO, GREEN, LOCATION fmt, ##__VA_ARGS__ )
#endif

#if LOG_LEVEL < LOG_WARNING
#define logWarning( fmt, ...  )
#else
#define logWarning( fmt, ...  )\
    outc( LOG_WARNING, YELLOW, LOCATION fmt, ##__VA_ARGS__ )
#endif

#if LOG_LEVEL < LOG_ERR
#define logError( fmt, ...  )
#else
#define logError( fmt, ...  )\
    outc( LOG_ERR, RED, LOCATION fmt, ##__VA_ARGS__ )
#endif

#else
#if LOG_LEVEL > LOG_DEBUG
#define logDebug( fmt, ...  )
#else
#define logDebug( fmt, ...  )\
    outc( LOG_DEBUG, DEFAULT, LOCATION fmt, ##__VA_ARGS__ )
#endif

#if LOG_LEVEL > LOG_INFO
#define logInfo( fmt, ...  )
#else
#define logInfo( fmt, ...  )\
    outc( LOG_INFO, GREEN, LOCATION fmt, ##__VA_ARGS__ )
#endif

#if LOG_LEVEL > LOG_WARNING
#define logWarning( fmt, ...  )
#else
#define logWarning( fmt, ...  )\
    outc( LOG_WARNING, YELLOW, LOCATION fmt, ##__VA_ARGS__ )
#endif

#if LOG_LEVEL > LOG_ERR
#define logError( fmt, ...  )
#else
#define logError( fmt, ...  )\
    outc( LOG_ERR, RED, LOCATION fmt, ##__VA_ARGS__ )
#endif

#endif

#ifdef __cplusplus
}
#endif

#endif
